# coding=utf-8
import mod.server.extraServerApi as serverApi
import mod.client.extraClientApi as clientApi


# TODO: 挖坑 搞定 World Event 部分
class ListenEvent(object):
    def __init__(self, system, systemType):
        if systemType == 'server':
            self.mEngineNamespace = serverApi.GetEngineNamespace()
            self.mEngineSystemName = serverApi.GetEngineSystemName()
        elif systemType == 'client':
            self.mEngineNamespace = clientApi.GetEngineNamespace()
            self.mEngineSystemName = clientApi.GetEngineSystemName()

        self.serverSystem = system
    
    def AddEntityClientEvent(self, instance, callback):
        """
        客户端

        描述：
            客户端侧创建新实体时触发

        Args:
            id	str	实体id
            posX	float	位置x
            posY	float	位置y
            posZ	float	位置z
            dimensionId	int	实体维度
            isBaby	bool	是否为幼儿
            engineTypeStr	str	实体类型
            itemName	str	物品identifier（仅当物品实体时存在该字段）
            auxValue	int	物品附加值（仅当物品实体时存在该字段）
        """

        self.serverSystem.ListenForEvent(
            self.mEngineNamespace,
            self.mEngineSystemName,
            'AddEntityClientEvent',
            instance,
            callback
        )

    def AddEntityServerEvent(self, instance, callback):
        """
        服务端

        描述：
            服务端侧创建新实体，或实体从存档加载时触发

        Args:
            id	str	实体id
            posX	float	位置x
            posY	float	位置y
            posZ	float	位置z
            dimensionId	int	实体维度
            isBaby	bool	是否为幼儿
            engineTypeStr	str	实体类型
            itemName	str	物品identifier（仅当物品实体时存在该字段）
            auxValue	int	物品附加值（仅当物品实体时存在该字段）
        """

        self.serverSystem.ListenForEvent(
            self.mEngineNamespace,
            self.mEngineSystemName,
            'AddEntityServerEvent',
            instance,
            callback
        )

    def AddPlayerAOIClientEvent(self, instance, callback):
        """
        客户端

        描述：
            玩家加入游戏或者其余玩家进入当前玩家所在的区块时触发的AOI事件，替换AddPlayerEvent

        Args:
            playerId	str	玩家id
        """

        self.serverSystem.ListenForEvent(
            self.mEngineNamespace,
            self.mEngineSystemName,
            'AddPlayerAOIClientEvent',
            instance,
            callback
        )

    def AddServerPlayerEvent(self, instance, callback):
        """
        服务端

        描述：
            触发时机：玩家加入时触发该事件。

        Args:
            id	str	玩家id
            isTransfer	bool	是否是切服时进入服务器，仅用于Apollo。如果是True，则表示切服时加入服务器，若是False，则表示登录进入网络游戏
            transferParam	str	切服传入参数，仅用于Apollo。调用【TransferToOtherServer】或【TransferToOtherServerById】传入的切服参数
            uid	int	仅用于Apollo，玩家的netease uid，玩家的唯一标识
            proxyId	int	仅用于Apollo，当前客户端连接的proxy服务器id
        """

        self.serverSystem.ListenForEvent(
            self.mEngineNamespace,
            self.mEngineSystemName,
            'AddServerPlayerEvent',
            instance,
            callback
        )

    def ChunkAcquireDiscardedClientEvent(self, instance, callback):
        """
        客户端

        描述：
            触发时机：客户端区块即将被卸载时

        Args:
            dimension	int	区块所在维度
            chunkPosX	int	区块的x坐标，对应方块X坐标区间为[x * 16, x * 16 + 15]
            chunkPosZ	int	区块的z坐标，对应方块Z坐标区间为[z * 16, z * 16 + 15]
        """

        self.serverSystem.ListenForEvent(
            self.mEngineNamespace,
            self.mEngineSystemName,
            'ChunkAcquireDiscardedClientEvent',
            instance,
            callback
        )

    def ChunkAcquireDiscardedServerEvent(self, instance, callback):
        """
        服务端

        描述：
            服务端区块即将被卸载时触发

        Args:
            dimension	int	区块所在维度
            chunkPosX	int	区块的x坐标，对应方块X坐标区间为[x * 16, x * 16 + 15]
            chunkPosZ	int	区块的z坐标，对应方块Z坐标区间为[z * 16, z * 16 + 15]
            entities	list(str)	随区块卸载而从世界移除的实体id的列表。注意事件触发时已经无法获取到这些实体的信息，仅供脚本资源回收用。
            blockEntities	list(dict)	随区块卸载而从世界移除的自定义方块实体的坐标的列表，列表元素dict包含posX，posY，posZ三个int表示自定义方块实体的坐标。注意事件触发时已经无法获取到这些方块实体的信息，仅供脚本资源回收用。
        """

        self.serverSystem.ListenForEvent(
            self.mEngineNamespace,
            self.mEngineSystemName,
            'ChunkAcquireDiscardedServerEvent',
            instance,
            callback
        )

    def ChunkGeneratedServerEvent(self, instance, callback):
        """
        服务端

        描述：
            触发时机：区块创建完成时触发

        Args:
            dimension	int	该区块所在的维度
            blockEntityData	[{"blockName":str,"posX":int,"posY":int,"posZ":int}...]/None	该区块中的自定义方块实体列表，通常是由自定义特征生成的自定义方块，没有自定义方块实体时该值为None
        """

        self.serverSystem.ListenForEvent(
            self.mEngineNamespace,
            self.mEngineSystemName,
            'ChunkGeneratedServerEvent',
            instance,
            callback
        )

    def ChunkLoadedClientEvent(self, instance, callback):
        """
        客户端

        描述：
            触发时机：客户端区块加载完成时

        Args:
            dimension	int	区块所在维度
            chunkPosX	int	区块的x坐标，对应方块X坐标区间为[x * 16, x * 16 + 15]
            chunkPosZ	int	区块的z坐标，对应方块Z坐标区间为[z * 16, z * 16 + 15]
        """

        self.serverSystem.ListenForEvent(
            self.mEngineNamespace,
            self.mEngineSystemName,
            'ChunkLoadedClientEvent',
            instance,
            callback
        )

    def otherEvent(self, event, instance, callback):
        """
        客户端 | 服务端

        描述：
            本开发包中未定义的事件
        """

        self.serverSystem.ListenForEvent(
            self.mEngineNamespace,
            self.mEngineSystemName,
            event,
            instance,
            callback
        )
